home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / kowin / archive / apl / gview120.lzh / gviewsrc.lzh / gview.c < prev    next >
C/C++ Source or Header  |  1995-02-27  |  7KB  |  291 lines

  1. /*
  2.     Copyright 1995 Ogasawara Hiroyuki(COR.)
  3. */
  4.  
  5. #include    <corlib.h>
  6. #include    <sys_doslib.h>
  7. #include    "gview.h"
  8. #include    "mpat.h"
  9.  
  10. GVIEW *
  11. MakeRegion( gp )
  12. GVIEW    *gp;
  13. {
  14.     GVIEW    *np= GV_Alloc( gp->rh, gp->rv, gp->color, "", NULL, 0 );
  15.     if( gp->color == WindowAttrGraphic65536 ){
  16.         unsigned short    *str= np->buf,
  17.                 *ptr= gp->buf+ gp->ry*gp->h+gp->rx;
  18.         int    y, x;
  19.         for( y= 0 ; y< gp->rv ; y++, ptr+= gp->h-gp->rh )
  20.             for( x= 0 ; x< gp->rh ; x++ )
  21.                 *str++= *ptr++;
  22.     }else{
  23.         unsigned char    *str= (void*)np->buf,
  24.                 *ptr= ((unsigned char*)gp->buf)+
  25.                             gp->ry*gp->h+gp->rx;
  26.         int    y, x;
  27.         for( y= 0 ; y< gp->rv ; y++, ptr+= gp->h-gp->rh )
  28.             for( x= 0 ; x< gp->rh ; x++ )
  29.                 *str++= *ptr++;
  30.         np->palet= gp->palet;
  31.     }
  32.     return    np;
  33. }
  34.  
  35. static void
  36. UserSend( wp, info, gp )
  37. WindowID    wp;
  38. EventInfo    *info;
  39. GVIEW        *gp;
  40. {
  41.     WindowID    cwp;
  42.     mspatset();
  43.     mspat( TRUE );
  44.     while( !(WindowGetEventInfo(info) && info->LeftOFF) );
  45.     cwp= WindowGetChild( WindowRootID, info );
  46.     mspat( FALSE );
  47.     if( cwp ){
  48.         if( wp && cwp == wp )
  49.             return;
  50.         info->option= EventUser;
  51.         info->ComData= UserGraphic;
  52.         if( gp->info == iPOS && (gp->rh < gp->h || gp->rv < gp->v) ){
  53.             GVIEW    *np= MakeRegion( gp );
  54.             (void*)(info->ComBuffer)= np;
  55.             WindowSendEvent( cwp, info );
  56.             MFREE( np );
  57.             return;
  58.         }else
  59.             (void*)(info->ComBuffer)= gp;
  60.         if( !WindowSendEvent( cwp, info ) ){
  61.             info->option= EventUser;
  62.             info->ComData= UserString;
  63.             (void*)(info->ComBuffer)= gp->fname;
  64.             WindowSendEvent( cwp, info );
  65.         }
  66.     }
  67. }
  68.  
  69. static void
  70. SetPalet( gp )
  71. GVIEW    *gp;
  72. {
  73.     unsigned short    *pal= gp->palet;
  74.     if( pal ){
  75.         int    i, count= GV_PaletSize( gp->color );
  76.         for( i= 0 ; i < count ; i++ )
  77.             GPALET( i, *pal++ );
  78.     }
  79. }
  80.  
  81. #define    XP    2
  82. #define    YP    2
  83. #define    FONT    12
  84.  
  85. static char *
  86. numform( str, i, len )
  87. char    *str;
  88. {
  89.     char    *p= str;
  90.     str+= len;
  91.     do{
  92.         *--str= i%10 +'0';
  93.     }while( i/= 10 );
  94.     for(; str > p ; *--str= ' ' );
  95.     return    p+len;
  96. }
  97.  
  98. static char    pbuf[]= "(   0,   0)-(   0,   0)[   0,   0]";
  99.  
  100. static
  101. PutInfo( dp, gp, mode )
  102. DrawBuf    *dp;
  103. GVIEW    *gp;
  104. {
  105.     static char    sbuf[]= "size (    ,    )";
  106.     int    attr= (gp->flag & fSLEEP) ? 9 :
  107.                     ((gp->flag & fICOLOR) ? 10 : 32+1);
  108.     switch( mode ){
  109.     case 1:
  110.         numform( sbuf+6 , gp->h, 4 );
  111.         numform( sbuf+11, gp->v, 4 );
  112.         DrawSetSymbol( dp++, XP,YP+ 0, gp->fname, attr, FONT );
  113.         DrawSetSymbol( dp++, XP,YP+14, sbuf, attr, FONT );
  114.         DrawSetSymbol( dp  , XP,YP+28, gp->comment, attr, FONT );
  115.         return    3;
  116.     case 2:
  117.         numform( pbuf+1 , gp->rx, 4 );
  118.         numform( pbuf+6 , gp->ry, 4 );
  119.         numform( pbuf+13, gp->rx+gp->rh-1, 4 );
  120.         numform( pbuf+18, gp->ry+gp->rv-1, 4 );
  121.         numform( pbuf+24, gp->rh, 4 );
  122.         numform( pbuf+29, gp->rv, 4 );
  123.     case 20:
  124.         DrawSetSymbol( dp++, XP,YP+ 0, pbuf, attr, FONT );
  125.         return    1;
  126.     }
  127.     return    0;
  128. }
  129.  
  130. static
  131. PosChk( x, h )
  132. {
  133.     if( x < 0 )
  134.         return    0;
  135.     if( x >= h )
  136.         return    h-1;
  137.     return    x;
  138. }
  139.  
  140. static
  141. SetPos( wp, info, gp )
  142. WindowID    wp;
  143. EventInfo    *info;
  144. GVIEW        *gp;
  145. {
  146.     int    attr= (gp->flag & (fSLEEP|fICOLOR)) ? 0 : 3,
  147.         bttr= (gp->flag & fSLEEP) ? 1 : 2;
  148.     DrawBuf    dbuf[3];
  149.     int    rx, ry, ex= -1, ey= -1, wx, wy;
  150.     WindowGetScreenPosition( wp, &rx, &ry );
  151.     gp->rx= PosChk( info->x, gp->h );
  152.     gp->ry= PosChk( info->y, gp->v );
  153.     numform( pbuf+1 , gp->rx, 4 );
  154.     numform( pbuf+6 , gp->ry, 4 );
  155.     for(; WindowGetEventInfo( info ), info->LeftStat ;){
  156.         info->x-= rx;
  157.         info->y-= ry;
  158.         if( info->x != ex || info->y != ey ){
  159.             DrawSetLine( dbuf, gp->rx, gp->ry, ex, ey,
  160.                             bttr, OptionBox );
  161.             numform( pbuf+13, ex= PosChk( info->x, gp->h ), 4 );
  162.             numform( pbuf+18, ey= PosChk( info->y, gp->v ), 4 );
  163.             if( (wx= ex-gp->rx) < 0 )    wx= -wx;
  164.             if( (wy= ey-gp->ry) < 0 )    wy= -wy;
  165.             numform( pbuf+24, ++wx, 4 );
  166.             numform( pbuf+29, ++wy, 4 );
  167.             PutInfo( dbuf+1, gp, 20 );
  168.             DrawSetLine( dbuf+2, gp->rx, gp->ry, ex, ey,
  169.                             attr, OptionBox );
  170.             WindowDraw( wp, dbuf, 3 );
  171.         }
  172.     }
  173.     if( ex >= 0 ){
  174.         DrawSetLine( dbuf, gp->rx, gp->ry, ex, ey, bttr, OptionBox );
  175.         if( gp->rx > ex ) gp->rx= ex;
  176.         if( gp->ry > ey ) gp->ry= ey;
  177.         gp->rh= wx;
  178.         gp->rv= wy;
  179.         PutInfo( dbuf+1, gp, gp->info );
  180.         WindowDraw( wp, dbuf, 2 );
  181.     }
  182. }
  183.  
  184. static void
  185. ClrInfo( gp )
  186. GVIEW    *gp;
  187. {
  188.     int    attr= (gp->flag & fSLEEP) ? ColorGray : ColorGraphic;
  189.     char    buf[80];
  190.     DrawBuf    dbuf[1];
  191.     WindowDraw( gp->wp, dbuf, GposSetClear( gp->wp, dbuf, attr,
  192.                                 ColorGray ) );
  193. }
  194.  
  195. static int
  196. EventExec( wp, info )
  197. WindowID    wp;
  198. EventInfo    *info;
  199. {
  200.     DrawBuf    dbuf[10], *dp;
  201.     GVIEW    *gp= WindowGetClientPointer( wp );
  202.     switch( info->option ){
  203.         case EventOpen:
  204.             WindowSetEventAttr( wp,  EventOpenON|EventRedrawON
  205.                 |EventCloseON|EventMouseSwitchON|EventPopON
  206.                 |EventMoveON|EventGraphicON|EventIconifyON
  207.                 |EventUserON );
  208.             return    TRUE;
  209.         case EventIconify:
  210.             WindowSetAttr( wp, 0 );
  211.             IconEnt( wp, *gp->fname ? gp->fname : "Gview",
  212.                             AttrDefault, 12 );
  213.             return    TRUE;
  214.         case EventRedraw:
  215.             if( gp->flag & fSLEEP ){
  216.                 DrawSetClear( dbuf, ColorGray );
  217.                 WindowDraw( wp, dbuf,
  218.                     PutInfo( dbuf+1, gp, gp->info)+1 );
  219.             }else{
  220.                 DrawBuf    *dp= dbuf;
  221.                 WindowSetAttr( gp->wp, gp->color );
  222.                 SetPalet( gp );
  223.                 dp+= GposSetClear( wp, dp,
  224.                         ColorGraphic, ColorGray );
  225.                 dp+= PutInfo( dp, gp, gp->info );
  226.                 DrawSetGraphicPut( dp++, 0, 0,
  227.                     gp->h-1, gp->v-1, (short*)gp->buf );
  228.                 WindowDraw( wp, dbuf, dp-dbuf );
  229.             }
  230.             return    TRUE;
  231.         case EventClose:
  232.             WindowClose( wp );
  233.             if( gp )
  234.                 MFREE( gp );
  235.             return    TRUE;
  236.         case EventUser:
  237.             return    TRUE;
  238.         case EventPop:
  239.         case EventMove:
  240.             if( gp->flag & fSLEEP ){
  241.                 gp->flag= !fSLEEP;
  242.                 WindowSetGraphicMode( gp->color );
  243.                 SetPalet( gp );
  244.             }
  245.             return    GposPopAndMove( wp, info );
  246.         case EventGraphic:
  247.             if( info->x == gp->color && (gp->flag & fSLEEP) ){
  248.                 gp->flag&=~fSLEEP;
  249.                 WindowRedraw( wp );
  250.             }else if( info->x!= gp->color && !(gp->flag & fSLEEP)){
  251.                 gp->flag|= fSLEEP;
  252.                 WindowRedraw( wp );
  253.             }
  254.             return    TRUE;
  255.  
  256.         case EventMouseSwitch:
  257.             if( gp->info == iPOS && info->LeftStat &&
  258.                         (info->ShiftStat & 4) ){
  259.                 SetPos( wp, info, gp );
  260.             }else if( info->LeftON ){
  261.                 UserSend( wp, info, gp );
  262.             }else if( info->RightON ){
  263.                 gp->info= (gp->info+1) % iLAST;
  264.                 if( gp->info ){
  265.                     ClrInfo( gp );
  266.                     WindowDraw( wp,dbuf,
  267.                         PutInfo( dbuf, gp, gp->info) );
  268.                 }else{
  269.                     ClrInfo( gp );
  270.                     gp->flag^= fICOLOR;
  271.                 }
  272.             }
  273.             return    TRUE;
  274.     }
  275.     return    FALSE;
  276. }
  277.  
  278.  
  279. void
  280. GV_Open( x, y, gp )
  281. GVIEW    *gp;
  282. {
  283.     gp->wp= WindowTitleOpen( x, y, gp->h, gp->v, NULL, "GraphicView",
  284.                         Close|Push|Icon, EventExec );
  285.     WindowSetClientData( gp->wp, 0, gp );
  286.     WindowSetGraphicMode( gp->color );
  287.     GposInit( gp->wp );
  288.     WindowRedraw( gp->wp );
  289. }
  290.  
  291.